Template Haskell
コンパイル時に展開される
構文解析時に展開される
Language.Haskell.THモジュールを使う
code:hs
{-# LANGUAGE TemplateHaskell #-} import Language.Haskell.TH
関数
runQ
HaskellコードからHaskell ASTを生成する
code:例hs
code:出力
InfixE
(Just (LitE (IntegerL 1)))
(VarE GHC.Num.+)
(Just (LitE (IntegerL 2)))
ppr
Haskell ASTからHaskellコードを生成する
しかしrunQの出力をそのままとれるわけではなくGHC.Num.+などは'(GHC.Num.+)と書く必要がある
$(..)
eval
..の部分にクオート式を書く
クォート式のQがそれ
クォート式
式クォート
[| .. |] :: Q Exp
または[e| .. |]
宣言クォート
[d| .. |] :: Q [Dec]
top-levelの宣言を書く
code:hs
型クォート
[t| .. |] :: Q Type
パターンクォート
[p| ... |] :: Q Pat
ユースケース
コンパイル時評価
ちょっと特殊なケース?
Haskellで文字列フォーマットをやる
"{hoge}です"みたいなやつ
[format|{_1}, {_2}!|] $ ("hello", "world")
assertのエラーメッセージに、問題の式を含める
let !x = [assert|a == "hello" && b > 9999999|]
[parseRoutes| / HomeR GET |]
参考
概要
最初に読むやつ